<?php
class Arm_Acl
{
	
	/**
	 * Zend_Acl
	 * @var Zend_Acl
	 */
	private $_zendAcl = null;
	
	/**
	 * Роль текущего пользователя по умолчанию.
	 * @var string
	 */
	private $_roleUser = null;
	
	/**
	 * названия модуля для которого загружаем acl
	 * @var acl
	 */
	private $_module = null;
	
	/**
	 * Группа для гостей
	 * @var string
	 */
	const GROUP_GUEST = 'guest';
	
	/**
	 * группа для зерегистрированных пользователей
	 * @var string
	 */
	const GROUP_USER = 'user';
	
	/**
	 * группа для администраторов
	 * @var string
	 */
	const GROUP_ADMIN = 'admin';
	
	
	/**
	 * 
	 * @param string $role guest|user|admin ....
	 * @param string $module названия модуля для которого загружаем права acl
	 */
	public function __construct($role, $module, $pathFileAcl=null)
	{
	  $this->_zendAcl = new Zend_Acl();	  
	  $this->_module  = $module;
	  // Установка ролей
	  $this->_setRole();
	  // Установка ресурсов
	  $this->_setResource();
	  // Установка разрешений
	  $this->_setAllow();
	  // Установка запретов
	  $this->_setDeny();
	  // Установка для текущего модуля
	  $this->_setModuleAcl($pathFileAcl);
	    // Установка роли текущего пользователя
	  $this->_setRoleActivUser($role);
	
	}
	
	
	/**
	 * Базовое создания ролей
	 */
	private function _setRole()
	{
	  $this->_zendAcl->addRole(self::GROUP_ADMIN);
	  $this->_zendAcl->addRole(self::GROUP_GUEST);
	  $this->_zendAcl->addRole(self::GROUP_USER, self::GROUP_GUEST);
	}
	
	/**
	 * Установка роли текущего пользователя.
	 * @param string $role
	 */
	private function _setRoleActivUser($role)
	{
	   $role = strtolower($role);
	   // если роль не существует будет брошено исключение
	   $this->_zendAcl->getRole($role);
	   $this->_roleUser = $role;
	   return;
	}
	
	/**
	 * базовое создания ресурсов
	 */
	private function _setResource()
	{
	 
	}
	
	/**
	 * Установка разрешений позволений на привилегии
	 */
	private function _setAllow()
	{
	  // для админа разрешаем все
	   $this->_zendAcl->allow('admin');	
	}
	
	/**
	 * Установка запретов 
	 */
	private function _setDeny()
	{
	}
	
	/**
	 * Проверка права использования.
	 * @param unknown_type $role
	 * @param unknown_type $resource
	 * @param unknown_type $privilege
	 */
	public function isAllowed($resource = null, $privilege = null)
	{
	//	Arm_Log::system('Ресурс ' . $resource . '  Привелигя' . $privilege . ' Роль: ' . $this->_roleUser, 'acl' );
	  	return $this->_zendAcl->isAllowed($this->_roleUser, $resource, $privilege);
	}
	
	/**
	 * Zend_Acl
	 * 
	 * @return Zend_Acl
	 */
	public function getZendAcl()
	{
	 return $this->_zendAcl;
	}
	
	/**
	 * Установка прав для модуля.
	 */
	private function _setModuleAcl($pathFileAcl=null)
	{
	 $adapter = new Arm_Acl_Adapter_File($this->_module, $this->getZendAcl(), $pathFileAcl);
	 // устанавливаем роли
	 $adapter->setRole();
	 // устанавливаем ресурсы
	 $adapter->setResource();
	 // устанавливаем разрешения
	 $adapter->setAllow();
	 // установка запретов
	 $adapter->setDeny(); 
	 return;
	}
	
	
	/**
	 * Вернет названия модуля для которого был создан обьект Acl
	 */
	public function getModule()
	{
	   return $this->_module;
	}
	

}